// 需要的接口定义
interface LayerOptions {
    id: string;
    type: string;
    source: {
        type: string;
        url: string;
    };
    'source-layer': string;
    paint: object;
}
const layersManager = { 
    /**
 * 添加图层
 * @param options 图层配置
 */
    addLayer(map: any, options: LayerOptions, load = true): void {
        if (!load && !map.getLayer(options.id)) {
            map.addLayer(options)
            return
        }
        map.on('styledata', () => {
            if (!map.getLayer(options.id)) {
                map.addLayer(options)
            }
        })
    },

    /**
     * 切换图层的可见性
     * @param layerId 图层 ID
     */
    toggleLayerVisibility(map: any, layerId: string): void {
        const currentVisibility = map.getLayoutProperty(layerId, 'visibility');
        const newVisibility = currentVisibility === 'visible' ? 'none' : 'visible';
        map.setLayoutProperty(layerId, 'visibility', newVisibility);
    },
    /**
     *  获取图层的可见性
     * @param map 地图对象
     * @param layerId  图层 ID
     * @returns 
     */
    getVisible(map: any, layerId: string) {
        return map.getLayoutProperty(layerId, 'visibility');
    },

    /**
     * 根据高度动态调整建筑物的颜色
     * @param layerId 图层 ID
     */
    updateBuildingLayerColor(map: any, layerId: string): void {
        const expression = [
            'interpolate',
            ['linear'],
            ['get', 'height'],
            0, '#f00',  // 低建筑物使用红色
            100, '#00f' // 高建筑物使用蓝色
        ];

        map.setPaintProperty(layerId, 'fill-extrusion-color', expression);
    },

    /**
     * 删除图层
     * @param layerId 图层 ID
     */
    removeLayer(map: any, layerId: string): void {
        if (map.getLayer(layerId)) {
            map.removeLayer(layerId);
            map.removeSource(layerId)
        }
    },

    /**
     * 移动图层顺序
     * @param layerId 图层 ID
     * @param position 目标位置 (如 'top' 或 'bottom')
     */
    moveLayer(map: any, layerId: string, position: string): void {
        if (map.getLayer(layerId)) {
            if (position === 'bottom') {
                // 获取第一个图层的 ID，将目标图层移到它之前
                map.moveLayer(layerId, map.getStyle().layers[0].id);
            } else if (position === 'top') {
                // 获取最后一个图层的 ID，将目标图层移到它之后
                map.moveLayer(layerId, map.getStyle().layers[map.getStyle().layers.length - 1].id);
            }
        }
    },

    /**
     * 更新地图中心点
     * @param lng 经度
     * @param lat 纬度
     */
    updateMapCenter(map: any, lng: number, lat: number): void {
        map.setCenter([lng, lat]);
    },

    /**
     * 获取地图当前中心点
     */
    getMapCenter(map: any,): mapboxgl.LngLat {
        return map.getCenter();
    },

    /**
     * 获取当前缩放级别
     */
    getZoomLevel(map: any,): number {
        return map.getZoom();
    },

    /**
     * 获取 Mapbox 地图实例
     */
    getMap(map: any,): mapboxgl.Map {
        return map;
    }
}

export { layersManager }